# 装饰器原理闭包
import time


# 垃圾回收的机制是所有对该变量的引用计数被清空，且从根对象无法访问到的值

# 内部函数 wrapper 引用了外部函数的变量 func
# 外部函数执行完毕后，由于func还存在被引用（被wrapper引用），因此不会被垃圾回收
# 从而形成了一种不删除的独立作用域
# 某一个变量或者对象被引用，不会被垃圾回收
# 因为被引用就代表被使用
# 垃圾回收的机制不会对被应用的变量进行操作
# 从而实现了 函数内部的一个独立的作用域
# 保护里面的私有变量不受外界干扰
# 除了保护私有变量之外
# 还可以存储一些其他变量的内容
# 就叫闭包

# 装饰器其实是一种内存泄露的骚操作


def run_time(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"函数装饰器，统计耗时:{end_time - start_time}")

        return result
    return wrapper